PyTorch 深度學習實戰 (Deep Learning with Pytorch)

PyTorch 深度學習實戰 (Deep Learning with Pytorch)

作者: [美]伊萊·史蒂文斯(Eli Stevens) [意]盧卡·安蒂加(Luca Antiga) [德]托馬斯·菲曼(Thomas Viehmann)
出版社: 人民郵電
出版在: 2022-02-01
ISBN-13: 9787115577672
ISBN-10: 7115577676
裝訂格式: 平裝
總頁數: 417 頁





內容描述


雖然很多深度學習工具都使用Python,但PyTorch 庫是真正具備Python 風格的。對於任何瞭解NumPy 和scikit-learn 等工具的人來說,上手PyTorch 輕而易舉。PyTorch 在不犧牲高級特性的情況下簡化了深度學習,它非常適合構建快速模型,並且可以平穩地從個人應用擴展到企業級應用。由於像蘋果、Facebook和摩根大通這樣的公司都使用PyTorch,所以當你掌握了PyTorth,就會擁有更多的職業選擇。
本書是教你使用 PyTorch 創建神經網絡和深度學習系統的實用指南。它幫助讀者快速從零開始構建一個真實示例:腫瘤圖像分類器。在此過程中,它涵蓋了整個深度學習管道的關鍵實踐,包括 PyTorch張量 API、用 Python 加載數據、監控訓練以及將結果進行可視化展示。
 
本書主要內容:
(1)訓練深層神經網絡;
(2)實現模塊和損失函數;
(3)使用 PyTorch Hub 預先訓練的模型;
(4)探索在 Jupyter Notebooks 中編寫示例代碼。
 
本書適用於對深度學習感興趣的 Python 程序員。瞭解深度學習的基礎知識對閱讀本書有一定的幫助,但讀者無須具有使用 PyTorch 或其他深度學習框架的經驗。


目錄大綱


第 1部分 PyTorch核心
第 1章 深度學習和PyTorch庫簡介 3
1.1 深度學習革命 4
1.2 PyTorch深度學習 5
1.3 為什麽用PyTorch 6
1.4 PyTorch如何支持深度學習概述 8
1.5 硬件和軟件要求 10
1.6 練習題 12
1.7 本章小結 13
 
第 2章 預訓練網絡 14
2.1 一個識別圖像主體的預訓練網絡 15
2.1.1 獲取一個預先訓練好的網絡用於圖像識別 16
2.1.2 AlexNet 17
2.1.3 ResNet 19
2.1.4 準備運行 19
2.1.5 運行模型 21
2.2 一個足以以假亂真的預訓練模型 23
2.2.1 GAN游戲 24
2.2.2 CycleGAN 25
2.2.3 一個把馬變成斑馬的網絡 26
2.3 一個描述場景的預訓練網絡 29
2.4 Torch Hub 31
2.5 總結 32
2.6 練習題 32
2.7 本章小結 33
 
第3章 從張量開始 34
3.1 實際數據轉為浮點數 34
3.2 張量:多維數組 36
3.2.1 從Python列表到PyTorch張量 36
3.2.2 構造第 1個張量 37
3.2.3 張量的本質 37
3.3 索引張量 40
3.4 命名張量 40
3.5 張量的元素類型 43
3.5.1 使用dtype指定數字類型 43
3.5.2 適合任何場合的dtype 44
3.5.3 管理張量的dtype屬性 44
3.6 張量的API 45
3.7 張量的存儲視圖 46
3.7.1 索引存儲區 47
3.7.2 修改存儲值:就地操作 48
3.8 張量元數據:大小、偏移量和步長 48
3.8.1 另一個張量的存儲視圖 49
3.8.2 無復制轉置 51
3.8.3 高維轉置 52
3.8.4 連續張量 53
3.9 將張量存儲到GPU 55
3.10 NumPy互操作性 57
3.11 廣義張量也是張量 57
3.12 序列化張量 58
3.13 總結 60
3.14 練習題 60
3.15 本章小結 60
 
第4章 使用張量表徵真實數據 61
4.1 處理圖像 62
4.1.1 添加顏色通道 62
4.1.2 加載圖像文件 63
4.1.3 改變佈局 63
4.1.4 正規化數據 64
4.2 三維圖像:體數據 65
4.3 表示表格數據 66
4.3.1 使用真實的數據集 67
4.3.2 加載葡萄酒數據張量 68
4.3.3 表示分數 70
4.3.4 獨熱編碼 70
4.3.5 何時分類 72
4.3.6 尋找閾值 73
4.4 處理時間序列 75
4.4.1 增加時間維度 76
4.4.2 按時間段調整數據 77
4.4.3 準備訓練 79
4.5 表示文本 81
4.5.1 將文本轉化為數字 81
4.5.2 獨熱編碼字符 82
4.5.3 獨熱編碼整個詞 83
4.5.4 文本嵌入 85
4.5.5 作為藍圖的文本嵌入 87
4.6 總結 88
4.7 練習題 88
4.8 本章小結 88
 
第5章 學習的機制 90
5.1 永恆的建模經驗 90
5.2 學習就是參數估計 92
5.2.1 一個熱點問題 93
5.2.2 收集一些數據 93
5.2.3 可視化數據 94
5.2.4 選擇線性模型首試 94
5.3 減少損失是我們想要的 95
5.4 沿著梯度下降 98
5.4.1 減小損失 99
5.4.2 進行分析 99
5.4.3 迭代以適應模型 101
5.4.4 歸一化輸入 104
5.4.5 再次可視化數據 106
5.5 PyTorch自動求導:反向傳播的一切 107
5.5.1 自動計算梯度 107
5.5.2 優化器 111
5.5.3 訓練、驗證和過擬合 115
5.5.4 自動求導更新及關閉 120
5.6 總結 121
5.7 練習題 122
5.8 本章小結 122
 
第6章 使用神經網絡擬合數據 123
6.1 人工神經網絡 124
6.1.1 組成一個多層網絡 125
6.1.2 理解誤差函數 125
6.1.3 我們需要的只是激活函數 126
6.1.4 更多激活函數 128
6.1.5 選擇最佳激活函數 128
6.1.6 學習對於神經網絡意味著什麽 129
6.2 PyTorch nn模塊 131
6.2.1 使用call()而不是forward() 132
6.2.2 回到線性模型 133
6.3 最終完成一個神經網絡 137
6.3.1 替換線性模型 137
6.3.2 檢查參數 138
6.3.3 與線性模型對比 141
6.4 總結 142
6.5 練習題 142
6.6 本章小結 142
 
第7章 區分鳥和飛機:從圖像學習 143
7.1 微小圖像數據集 143
7.1.1 下載CIFAR-10 144
7.1.2 Dataset類 145
7.1.3 Dataset變換 146
7.1.4 數據歸一化 149
7.2 區分鳥和飛機 150
7.2.1 構建數據集 151
7.2.2 一個全連接模型 152
7.2.3 分類器的輸出 153
7.2.4 用概率表示輸出 154
7.2.5 分類的損失 157
7.2.6 訓練分類器 159
7.2.7 全連接網絡的局限 165
7.3 總結 167
7.4 練習題 167
7.5 本章小結 168
 
第8章 使用捲積進行泛化 169
8.1 捲積介紹 169
8.2 捲積實戰 172
8.2.1 填充邊界 173
8.2.2 用捲積檢測特徵 175
8.2.3 使用深度和池化技術進一步研究 177
8.2.4 為我們的網絡整合一切 179
8.3 子類化nn.Module 181
8.3.1 將我們的網絡作為一個nn.Module 182
8.3.2 PyTorch如何跟蹤參數和子模塊 183
8.3.3 函數式API 184
8.4 訓練我們的convnet 185
8.4.1 測量精度 187
8.4.2 保存並加載我們的模型 188
8.4.3 在GPU上訓練 188
8.5 模型設計 190
8.5.1 增加內存容量:寬度 191
8.5.2 幫助我們的模型收斂和泛化:正則化 192
8.5.3 深入學習更復雜的結構:深度 195
8.5.4 本節設計的比較 200
8.5.5 已經過時了 201
8.6 總結 201
8.7 練習題 201
8.8 本章小結 202
 
第 2部分 從現實世界的圖像中學習:肺癌的早期檢測
第9章 使用PyTorch來檢測癌症 205
9.1 用例簡介 205
9.2 為一個大型項目做準備 206
9.3 到底什麽是CT掃描 207
9.4 項目:肺癌的端到端檢測儀 210
9.4.1 為什麽我們不把數據扔給神經網絡直到它起作用呢 213
9.4.2 什麽是結節 216
9.4.3 我們的數據來源:LUNA大挑戰賽 217
9.4.4 下載LUNA數據集 218
9.5 總結 219
9.6 本章小結 219
 
第 10章 將數據源組合成統一的數據集 220
10.1 原始CT數據文件 222
10.2 解析LUNA的標註 數據 222
10.2.1 訓練集和驗證集 224
10.2.2 統一標註和候選 數據 225
10.3 加載單個CT掃描 227
10.4 使用病人坐標系定位結節 230
10.4.1 病人坐標系 230
10.4.2 CT掃描形狀和體素大小 232
10.4.3 毫米和體素地址之間的轉換 233
10.4.4 從CT掃描中取出一個結節 234
10.5 一個簡單的數據集實現 235
10.5.1 使用getCtRawCandidate()函數緩存候選數組 238
10.5.2 在LunaDataset.init()中構造我們的數據集 238
10.5.3 分隔訓練集和驗證集 239
10.5.4 呈現數據 240
10.6 總結 241
10.7 練習題 241
10.8 本章小結 242
 
第 11章 訓練分類模型以檢測可疑腫瘤 243
11.1 一個基本的模型和訓練循環 243
11.2 應用程序的主入口點 246
11.3 預訓練和初始化 247
11.3.1 初始化模型和優化器 247
11.3.2 數據加載器的維護和供給 249
11.4 我們的首次神經網絡設計 251
11.4.1 核心捲積 251
11.4.2 完整模型 254
11.5 訓練和驗證模型 257
11.5.1 computeBatchLoss()函數 258
11.5.2 類似的驗證循環 260
11.6 輸出性能指標 261
11.7 運行訓練腳本 265
11.7.1 訓練所需的數據 266
11.7.2 插曲:enumerateWithEstimate()函數 266
11.8 評估模型:得到99.7%的正確率是否意味著我們完成了任務 268
11.9 用TensorBoard繪制訓練指標 269
11.9.1 運行TensorBoard 269
11.9.2 增加TensorBoard對指標記錄函數的支持 272
11.10 為什麽模型不學習檢測結節 274
11.11 總結 275
11.12 練習題 275
11.13 本章小結 275
 
第 12章 通過指標和數據增強來提升訓練 277
12.1 高級改進計劃 278
12.2 好狗與壞狗:假陽性與假陰性 279
12.3 用圖表表示陽性與陰性 280
12.3.1 召回率是Roxie的強項 282
12.3.2 精度是Preston的強項 283
12.3.3 在logMetrics()中實現精度和召回率 284
12.3.4 我們的終極性能指標:F1分數 285
12.3.5 我們的模型在新指標下表現如何 289
12.4 理想的數據集是什麽樣的 290
12.4.1 使數據看起來更理想化 292
12.4.2 使用平衡的LunaDataset與之前的數據集運行情況對比 296
12.4.3 認識過擬合 298
12.5 重新審視過擬合的問題 300
12.6 通過數據增強防止過擬合 300
12.6.1 具體的數據增強技術 301
12.6.2 看看數據增強帶來的改進 306
12.7 總結 308
12.8 練習題 308
12.9 本章小結 309
 
第 13章 利用分割法尋找可疑結節 310
13.1 向我們的項目添加第 2個模型 310
13.2 各種類型的分割 312
13.3 語義分割:逐像素分類 313
13.4 更新分割模型 317
13.5 更新數據集以進行分割 319
13.5.1 U-Net有非常具體的對輸入大小的要求 320
13.5.2 U-Net對三維和二維數據的權衡 320
13.5.3 構建真實、有效的數據集 321
13.5.4 實現Luna2dSegmentationDataset 327
13.5.5 構建訓練和驗證數據 331
13.5.6 實現TrainingLuna2dSegmentationDataset 332
13.5.7 在GPU上增強數據 333
13.6 更新用於分割的訓練腳本 335
13.6.1 初始化分割和增強模型 336
13.6.2 使用Adam優化器 336
13.6.3 骰子損失 337
13.6.4 將圖像導入TensorBoard 340
13.6.5 更新指標日誌 343
13.6.6 保存模型 344
13.7 結果 345
13.8 總結 348
13.9 練習題 348
13.10 本章小結 349
 
第 14章 端到端的結節分析及下一步的方向 350
14.1 接近終點線 350
14.2 驗證集的獨立性 352
14.3 連接CT分割和候選結節分類 353
14.3.1 分割 354
14.3.2 將體素分組為候選結節 355
14.3.3 我們發現結節了嗎?分類以減少假陽性 357
14.4 定量驗證 360
14.5 預測惡性腫瘤 361
14.5.1 獲取惡性腫瘤信息 361
14.5.2 曲線基線下的區域:按直徑分類 362
14.5.3 重用預先存在的權重:微調 365
14.5.4 TensorBoard中的輸出 370
14.6 在診斷時所見的內容 374
14.7 接下來呢?其他靈感和數據的來源 376
14.7.1 防止過擬合:更好的正則化 377
14.7.2 精細化訓練數據 379
14.7.3 競賽結果及研究論文 380
14.8 總結 381
14.9 練習題 382
14.10 本章小結 383
 
第3部分 部署
第 15章 部署到生產環境 387
15.1 PyTorch模型的服務 388
15.1.1 支持Flask服務的模型 388
15.1.2 我們想從部署中得到的東西 390
15.1.3 批處理請求 391
15.2 導出模型 395
15.2.1 PyTorch與ONNX的互操作性 396
15.2.2 PyTorch自己的導出:跟蹤 397
15.2.3 具有跟蹤模型的服務器 398
15.3 與PyTorch JIT編譯器交互 398
15.3.1 超越經典Python/PyTorch的期望是什麽 399
15.3.2 PyTorch作為接口和後端的雙重特性 400
15.3.3 TorchScript 400
15.3.4 為可追溯的差異編寫腳本 404
15.4 LibTorch:C++中的PyTorch 405
15.4.1 從C++中運行JITed模型 405
15.4.2 從C++ API開始 408
15.5 部署到移動設備 411
15.6 新興技術:PyTorch
 模型的企業服務 416
15.7 總結 416
15.8 練習題 416
15.9 本章小結 416


作者介紹


作者
伊莱·史蒂文斯(Eli Stevens)职业生涯的大部分时间都在美国硅谷的初创公司工作,从软件工程师(网络设备制造业)到首席技术官(开发肿瘤放疗软件)。在本书出版时,他正在汽车自动驾驶行业从事机器学习相关工作。
 
卢卡·安蒂加(Luca Antiga)于21 世纪初担任生物医学工程研究员。2010 年到2020 年间,他是一家人工智能工程公司的联合创始人和首席技术官。他参与了多个开源项目,包括PyTorch 的核心模块。最近,他作为联合创始人创建了一家总部位于美国的初创公司,专注于数据定义软件的基础设施。
 
托马斯·菲曼(Thomas Viehmann)是一名德国慕尼黑的机器学习和PyTorch 的专业培训师和顾问,也是PyTorch 核心开发人员。拥有数学博士学位的他不畏惧理论,擅长将理论应用于实际的计算挑战。
 
译者
牟大恩,武汉大学硕士研究生毕业,曾先后在网易杭州研究院、优酷土豆集团、海通证券总
部负责技术研发及系统架构设计工作,目前任职于东方证券资产管理有限公司。他有多年的Java
开发及系统设计经验,专注于互联网金融及大数据应用相关领域,热爱技术,喜欢钻研前沿技术,
是机器学习及深度学习的深度爱好者。近年来著有《Kafka 入门与实践》,译有《Kafka Streams
实战》,已提交技术发明专利申请两项。




相關書籍

Teach Your Kids to Code: A Parent-Friendly Guide to Python Programming (Paperback)

作者 Bryson Payne

2022-02-01

Python數據分析與數據化運營

作者 宋天龍

2022-02-01

機器學習基礎 (Foundations of Machine Learning, 2/e)

作者 [美] 梅爾亞·莫里(Mehryar Mohri)紐約大學 谷歌研究院 阿夫欣·羅斯塔米扎達爾(Afshin Rostamizadeh)谷歌研究院 阿米特·塔爾沃卡爾(Ameet Talwalkar)卡內基·梅隆大學

2022-02-01